home *** CD-ROM | disk | FTP | other *** search
-
- {
- Here's a TP function that will report the current UART baud rate for
- any serial port device (modem, mouse, etc.) ...
- }
-
- (*************************** GETBAUD.PAS ***************************)
- PROGRAM GetBaud; { compiler: Turbo Pascal 4.0+ }
- { Mar.23.94 Greg Vigneault }
-
- (*-----------------------------------------------------------------*)
- { get the current baud rate of a serial i/o port (reads the UART)...}
-
- FUNCTION SioRate (ComPort :WORD; VAR Baud :LONGINT) :BOOLEAN;
- CONST DLAB = $80; { divisor latch access bit }
- VAR BaseIO, { COM base i/o port address }
- BRGdiv, { baud rate generator divisor }
- regDLL, { BRG divisor, latched LSB }
- regDLM, { BRG divisor, latched MSB }
- regLCR :WORD; { line control register }
- BEGIN
- Baud := 0; { assume nothing }
- IF (ComPort IN [1..4]) THEN BEGIN { must be 1..4 }
- BaseIO := MemW[$40:(ComPort-1) SHL 1]; { fetch base i/o port }
- IF (BaseIO <> 0) THEN BEGIN { has BIOS seen it? }
- regDLL := BaseIO; { BRGdiv, latched LSB }
- regDLM := BaseIO + 1; { BRGdiv, latched MSB }
- regLCR := BaseIO + 3; { line control reg }
- Port[regLCR] := Port[regLCR] OR DLAB; { set DLAB }
- BRGdiv := WORD(Port[regDLL]); { BRGdiv LSB }
- BRGdiv := BRGdiv OR WORD(Port[regDLM]) SHL 8; { BRGdiv MSB }
- Port[regLCR] := Port[regLCR] AND NOT DLAB; { reset DLAB }
- IF (BRGdiv <> 0) THEN
- Baud := 1843200 DIV (LONGINT(BRGdiv) SHL 4); { calc bps }
- END; {IF BaseIO}
- END; {IF ComPort}
- SioRate := (Baud <> 0); { success || failure }
- END {SioRate};
-
- (*-----------------------------------------------------------------*)
-
- VAR ComPort : WORD; { will be 1..4 }
- Baud : LONGINT; { as high as 115200 bps }
-
- BEGIN {GetBaud}
-
- REPEAT
- WriteLn; Write ('Read baud rate for which COM port [1..4] ?: ');
- ReadLn (ComPort);
- IF NOT SioRate (ComPort, Baud) THEN BEGIN
- Write ('!',CHR(7)); {!beep}
- CASE ComPort OF
- 1..4 : WriteLn ('COM',ComPort,' is absent; try another...');
- ELSE WriteLn ('Choose a number: 1 through 4...');
- END; {CASE}
- END; {IF}
- UNTIL (Baud <> 0);
-
- WriteLn ('-> COM',ComPort,' is set for ',Baud,' bits-per-second');
-
- END {GetBaud}.